package cn.itcast.service.impl;

import cn.itcast.dao.RoleDao;
import cn.itcast.entity.PageResult;
import cn.itcast.pojo.Role;
import cn.itcast.service.RoleService;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Stream;

@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    /**
     * 保存用户基本信息
     *
     * @param role
     */
    @Override
    public void add(Role role,Integer[] permissionIds,Integer[] menuIds) {
        roleDao.add(role);
        //关联保存角色信息
        if (permissionIds != null) {
            Integer roleId = role.getId();
            setRoleAndPermission(roleId, permissionIds);
        }
        if (menuIds != null) {
            Integer roleId = role.getId();
            setRoleAndMenu(roleId, menuIds);
        }
    }
    /**
     * 设置角色和菜单的关联信息
     *
     * @param roleId
     * @param menuIds
     */
    private void setRoleAndMenu(Integer roleId, Integer[] menuIds) {
        Stream.of(menuIds).forEach(menuId -> roleDao.setMenuAssociation(roleId, menuId));
    }

    /**
     * 设置角色和权限的关联信息
     *
     * @param roleId
     * @param permissionIds
     */
    private void setRoleAndPermission(Integer roleId, Integer[] permissionIds) {
        Stream.of(permissionIds).forEach(permissionId -> roleDao.setPermissionAssociation(roleId, permissionId));
    }

    /**
     * 条件查询用户信息
     *
     * @param queryString
     * @return
     */
    @Transactional
    @Override
    public PageResult pageQuery(Integer currentPage, Integer pageSize, String queryString) {
        PageHelper.startPage(currentPage, pageSize);
        Page<Role> page = roleDao.selectByCondition(queryString);
        return new PageResult(page.getTotal(), page.getResult());
    }

    /**
     * 根据角色id查询角色信息
     *
     * @param id
     * @return
     */
    @Override
    public Role findById(Integer id) {
        return roleDao.findById(id);
    }


/**
     * 根据Id更新用户基本信息
     *
     * @param role
     */
    @Transactional
    @Override
    public void update(Role role, Integer[] permissionIds, Integer[] menuIds) {
        //更新用户基本信息
        roleDao.update(role);
        //删除用户关联权限信息
        roleDao.deletePermissionAssociation(role.getId());
        //删除用户关联菜单信息
        roleDao.deleteMenuAssociation(role.getId());
        //设置用户关联权限信息
        setRoleAndPermission(role.getId(), permissionIds);
        //设置用户关联菜单信息
        setRoleAndMenu(role.getId(),menuIds);
    }

    /**
     * 根据id删除角色信息
     *
     * @param id
     */
    @Transactional
    @Override
    public void deleteById(Integer id) {

        //判断该检查项是否被引用
        int count = roleDao.selectRoleReferencedCount(id);
        if(count>0){
            throw new RuntimeException("当前角色被引用，不能删除 !");
        }

        //删除用户关联权限信息
        roleDao.deletePermissionAssociation(id);
        //删除用户关联菜单信息
        roleDao.deleteMenuAssociation(id);

        //删除用户基本信息
        roleDao.deleteById(id);
    }

    /**
     * 查询所有用户数据
     *
     * @return
     */
    @Override
    public List<Role> findAll() {
        return roleDao.findAll();
    }

    /**
     * 查询角色下的菜单ID集合
     *
     * @param roleId
     * @return
     */
    @Override
    public Integer[] selectedMenusId(Integer roleId) {
        return roleDao.findMenuAssociationIds(roleId);
    }

    /**
     * 查询角色下的权限ID集合
     *
     * @param roleId
     * @return
     */
    @Override
    public Integer[] selectedPermissionsId(Integer roleId) {
        return roleDao.findPermissionAssociationIds(roleId);
    }

    @Override
    public String findKeywordById(Integer id) {
        return roleDao.findKeywordById(id);
    }


}
